package com.tanhua.dubbo.server.service;

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.tanhua.dubbo.server.config.HuanXinConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 获得环信的token，
 * 1.从redis中获取
 * 2.或者重新请求环信（http）
 * 3.缓存到redis中
 */
@Service
@Slf4j
public class TokenService {

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    @Autowired
    private HuanXinConfig huanXinConfig;

    /**
     * 调用该方法返回环信token
     * @return token
     */
    public String getToken(){
        //1. 从redis中查询，如果有直接返回，没有就重新请求
        String redisKey = "HX_TOKEN";
        String token = redisTemplate.opsForValue().get(redisKey);
        if (StrUtil.isNotEmpty(token)){
            return token;
        }

        //2. 重新请求
        //访问环信接口获取token
        return refreshToken();

    }

    public String refreshToken() {
        //拼接请求路径
        String targetUrl = huanXinConfig.getUrl()+huanXinConfig.getOrgName()+"/"+huanXinConfig.getAppName()+"/token";
        //封装请求体信息
        Map<String,String> param = new HashMap<>();
        param.put("grant_type","client_credentials");
        param.put("client_id",huanXinConfig.getClientId());
        param.put("client_secret",huanXinConfig.getClientSecret());
        //转换成json格式
        String jsonStr = JSONUtil.toJsonStr(param);

        //请求环信接口  请求路径，请求体，超时时间  返回：HttpResponse响应
        HttpResponse response = HttpRequest.post(targetUrl).body(jsonStr).timeout(20000).execute();
        //这个请求有没有成功
        if (!response.isOk()){
            log.error("刷新token失败");
            return null;
        }

        //获得环信的响应体信息
        String body = response.body();
        //将获得的json转换成对象
        JSONObject jsonObject = JSONUtil.parseObj(body);
        //获得其中的token信息
        String token = jsonObject.getStr("access_token");

        if (StrUtil.isNotEmpty(token)){
            //缓存到redis中 设置过期时间为环信过期时间-1小时
            redisTemplate.opsForValue().set("HX_TOKEN",token,jsonObject.getLong("expires_in")-3600, TimeUnit.SECONDS);
            return token;
        }
        return null;
    }
}
